package Leetcode第二期;

/**
 * @author : K k
 * @date : 20:31 2020/9/21
 * 给定一个包含 n + 1 个整数的数组 nums，其数字都在 1 到 n 之间（包括 1 和 n），可知至少存在一个重复的整数。假设只有一个重复的整数，找出这个重复的数。
 *
 * 示例 1:
 *
 * 输入: [1,3,4,2,2]
 * 输出: 2
 * 示例 2:
 *
 * 输入: [3,1,3,4,2]
 * 输出: 3
 * 说明：
 *
 * 不能更改原数组（假设数组是只读的）。
 * 只能使用额外的 O(1) 的空间。
 * 时间复杂度小于 O(n2) 。
 * 数组中只有一个重复的数字，但它可能不止重复出现一次。
 */
public class 寻找重复数_287 {

    //思路：抽屉原理  出现的数是1-n，但至少存在一个重复性，若根据(1+n)/2来划分 则无重复的话则小于等于(1+n)/2的个数只有(1+n)/2个。若大于则说明前面有重复
    public int findDuplicate(int[] nums) {
        int left=1;
        int right=nums.length-1;
        while (left < right) {
            int count=0;
            int mid=(right+left)>>1;
            for(int num:nums){
                if(num<=mid){
                    count++;
                }
            }

            if(count>mid){
                //说明左边组存在重复项
                right=mid;
            }else{
                left=mid+1;
            }
        }
        return left;
    }
}
